import datetime
import decimal
# 数据库返回数据list转dict
from sqlalchemy.util._collections import AbstractKeyedTuple

from comment.models import db

#数据库返回数据list转dict
"""
if isinstance(res_obj[0], AbstractKeyedTuple):判断列表里的第一个数据是不是元组，是为了判断这个list里存储的是结果集数据还是对象实例数据，因为元组类型通常表示的是结果集中的一行数据，
而对象实例数据则是指由ORM框架从数据库中获取的实例化对象。多条数据是结果集，单条数据是对象实例数据
return datalist_format([dict(zip(result.keys(), result)) for result in res_obj])
在这里，result是一个 AbstractKeyedTuple对象，它有一个 keys()方法可以返回元组中每个元素的名称，因此 result.keys()返回的是元组中每个元素的名称。使用 zip()函数将元素名称和元组中对应的值组合成键值对，
再使用 dict()函数将键值对转换成字典，就可以将元组转换成字典了,如id:1,keys获得id,result是1
"""
def datalist2dict(res_obj):
    if not res_obj:
        return None
    if isinstance(res_obj, list):  # 列表解析
        if len(res_obj) == 0:
            return None
        if isinstance(res_obj[0], AbstractKeyedTuple):  ## 不是列表就会是单条数据
            dic_list = datalist_format([dict(zip(result.keys(), result)) for result in res_obj])
            return dic_list
        elif isinstance(res_obj[0], db.Model):# 只需要res_obj里的一个属性就可以判断，判断是否是对象
            # __dict__可以查看属性的内容
            [item.__dict__.pop("_sa_instance_state") for item in res_obj] # 去掉无用的数据_sa_instance_state   # 在db中存在json字段时返回的是dict
            return datalist_format([item.__dict__ for item in res_obj])
        elif isinstance(res_obj[0], dict):  #在db中存在json字段时返回的是dict
            return datalist_format(res_obj)
        else:
            return None
    else:
        return data2dict(res_obj)





# 数据库返回单个数据转dict
def data2dict(res_obj):
    if not res_obj:
        return None
    if isinstance(res_obj, dict):
        return res_obj
    elif isinstance(res_obj, AbstractKeyedTuple):
        dict_obj = data_format(dict(zip(res_obj.keys(), res_obj)))
        return dict_obj
    elif isinstance(res_obj, db.Model):
        res_obj.__dict__.pop("_sa_instance_state")
        return data_format(res_obj.__dict__)
    else:
        return None



"""
    列表 时间转字符串 Decimal转浮点型,不转换会报错
    ：:param res ：列表
    ：:return 列表
"""


def datalist_format(reslist):
    if not reslist or not isinstance(reslist, list):
        return reslist
    for item in reslist:
        for key in item.keys():
            if isinstance(item[key], datetime.datetime) or isinstance(item[key], datetime.date):
                item[key] = str(item[key])
            if isinstance(item[key], decimal.Decimal):
                item[key] = float(item[key])
    return reslist


"""
    对象中时间转字符串 Decimal转浮点型
    :param bean 传入dict
    :return:dict
"""


def data_format(bean):
    if not bean or not isinstance(bean, dict):
        return bean
    for key in bean.keys():
        if isinstance(bean[key], datetime.datetime) or isinstance(bean[key], datetime.date):
            bean[key] = str(bean[key])
        if isinstance(bean[key], decimal.Decimal):
            bean[key] = float(bean[key])
    return bean
